#ifndef _XLSXREADER_H
#define _XLSXREADER_H
#include "Util.h"

#include <OpenXLSX/OpenXLSX.hpp>
#include <OpenXLSX/headers/XLCellValue.hpp>
#include <OpenXLSX/headers/XLDocument.hpp>
#include <cstdint>
#include <iostream>
#include <iterator>
#include <vector>
using namespace OpenXLSX;

enum DataType {
    INT,
    FLOAT,
    BOOL
};

typedef struct Data {
    uint32_t    sAddr;
    DataType    type;
    std::string devName;
    std::string varName;
    std::string desc;
    // 换个名字
    bool isReadable;
    bool isWritable;

    // 判断是否相等
    bool operator==(const Data &data) const {
        return sAddr == data.sAddr && type == data.type &&
               devName == data.devName && varName == data.varName &&
               desc == data.desc;
    }
} Data;

class XlsxReader {
  public:
    XlsxReader();

    ~XlsxReader();
    void OpenFile(std::string filename);
    void CloseFile();

    void Parse();

  private:
    // 判断数据类型
    // NOTE: 判断数据类型
    // BOOL 通过转发参数 判断
    // INT 缩放系数为1
    // FLOAT 缩放系数不为1
    DataType JudgeDataType(XLCellValue retransParas,
                           XLCellValue originalMinValue,
                           XLCellValue originalMaxValue,
                           XLCellValue realMinValue,
                           XLCellValue realMaxValue);
    // 判断是否可读
    bool JudgeReadable(XLCellValue retransParas);

    // 判断是否可写
    bool JudgeWritable(XLCellValue retransParas);

    // 帮助函数，执行减法并返回结果作为variant
    std::variant<float, int>
    SubtractVariants(const std::variant<float, int> &a,
                     const std::variant<float, int> &b);

    // 帮助函数，比较两个variant是否相等
    bool CompareVariants(const std::variant<float, int> &a,
                         const std::variant<float, int> &b);

    std::variant<float, int> GetValue(const XLCellValue &value);

  public:
    static std::vector<Data> dataList;

  private:
    XLDocument doc;
};

#endif // !_XLSXREADER_H
